#ifndef _FCNTL_H
#define _FCNTL_H

#include <sys/types.h>  // 类型头文件 定义了基本的系统数据类型
// open/fcntl NOCTTY和NDELAY 现在还没有实现
/* open/fcntl - NOCTTY, NDELAY isn't implemented yet */
#define O_ACCMODE	00003   // 文件访问模式屏蔽码
#define O_RDONLY	   00   // 以只读方式打开文件
#define O_WRONLY	   01   // 以只写方式打开文件
#define O_RDWR		   02   // 以读写方式打开文件
#define O_CREAT		00100	/* not fcntl */ // 如果文件不存在就创建
#define O_EXCL		00200	/* not fcntl */ // 独占使用文件标志
#define O_NOCTTY	00400	/* not fcntl */ // 不分配控制终端
#define O_TRUNC		01000	/* not fcntl */ // 若文件已存在且是写操作 则长度截为0
#define O_APPEND	02000   // 以添加方式打开 文件指针置为文件尾
#define O_NONBLOCK	04000	/* not fcntl */ // 非阻塞方式打开和操作文件
#define O_NDELAY	O_NONBLOCK  // 非阻塞方式打开和操作文件
// 下面定义了fcntl命令 注意目前锁定命令还不支持 而其他命令实际上还没有测试过
/* Defines for fcntl-commands. Note that currently
 * locking isn't supported, and other things aren't really
 * tested.
 */ // 文件句柄（描述符）操作函数 fcntl（）的命令
#define F_DUPFD		0	/* dup */   // 复制文件句柄为最小数值的句柄
#define F_GETFD		1	/* get f_flags */   // 取文件句柄标志
#define F_SETFD		2	/* set f_flags */   // 设置文件句柄标志
#define F_GETFL		3	/* more flags (cloexec) */  // 取文件状态标志和访问模式
#define F_SETFL		4   // 设置文件状态标志和访问模式
#define F_GETLK		5	/* not implemented */   // 返回阻止锁定的flock结构
#define F_SETLK		6   // 设置或清除锁定
#define F_SETLKW	7   // 等待设置或清除锁定
// 用于 F_GETFL或FSETFL
/* for F_[GET|SET]FL */ // 在执行exec（）簇函数时关闭文件句柄
#define FD_CLOEXEC	1	/* actually anything with low bit set goes */   // 实际上只要低位为1即可
// 以下是锁定类型 任何函数中都还没有实现 POSIX 标准要求这些函数
/* Ok, these are locking features, and aren't implemented at any
 * level. POSIX wants them.
 */
#define F_RDLCK		0   // 共享或读文件锁定
#define F_WRLCK		1   // 独占或写文件锁定
#define F_UNLCK		2   // 文件解谜

/* Once again - not implemented, but ... */ // 同样 - 也还没有实现 但是
struct flock {  // 文件锁定操作数据结构 描述了受影响文件段的类型（l_type）开始偏移（l_where） 相对偏移(l_start) 锁定长度（l_len）和实施锁定的进程id
	short l_type;   // 锁定类型（F_RDLCK F_WRLCK F_UNLCK）
	short l_whence; // 开始偏移（SEEK_SET SEEK_CUR SEEK_END）
	off_t l_start;  // 阻塞锁定的开始处 相对偏移 （字节数）
	off_t l_len;    // 阻塞锁定的大小 如果是0 则为到文件末尾
	pid_t l_pid;    // 加锁的进程id
};
// 以下是使用上述标志或命令的函数原型 创建新文件或重写一个已存在文件
extern int creat(const char * filename,mode_t mode);    // 参数 filename是欲创建文件的文件名 mode是创建文件的属性
extern int fcntl(int fildes,int cmd, ...);  // 文件句柄操作 会影响文件的打开 参数 fileds-是文件句柄 cmd 是操作命令 见上面23-30行
extern int open(const char * filename, int flags, ...); // 打开文件 在文件与句柄间建立联系 参数 filename-是欲打开文件名 flags是上面标志的组合

#endif
